"""
MCP 客户端示例

这个示例展示了如何使用 MCP（Model Context Protocol）客户端管理器。
"""

import asyncio
from inscode_agent.mcps import MCPClientManager


async def create_mcp_client_manager() -> MCPClientManager:
    """创建并初始化 MCP 客户端管理器"""
    print("=== 创建 MCP 客户端管理器 ===")
    
    # MCP 配置文件路径
    config_path = "/Users/wanghan/IdeaProjects/ai/inscode-agent/test/mcp.json"
    
    # 创建管理器
    manager = MCPClientManager(config_path)
    
    # 初始化
    await manager.initialize()
    
    print("MCP 客户端管理器初始化完成")
    return manager


async def list_available_tools(manager: MCPClientManager):
    """列出所有可用的工具"""
    print("=== 列出所有可用的工具 ===")
    
    try:
        # 获取所有工具的字符串表示
        tools_str = manager.get_all_tools_str_sync()
        print("可用工具:")
        print(tools_str)
        return tools_str
    except Exception as e:
        print(f"获取工具列表失败: {e}")
        return None


async def get_tool_details(manager: MCPClientManager):
    """获取工具详细信息"""
    print("=== 获取工具详细信息 ===")
    
    try:
        # 获取所有工具
        tools = manager.get_all_tools()
        
        print(f"总共找到 {len(tools)} 个工具:")
        for i, tool in enumerate(tools, 1):
            print(f"{i}. {tool.name}")
            if hasattr(tool, 'description') and tool.description:
                print(f"   描述: {tool.description}")
            if hasattr(tool, 'inputSchema') and tool.inputSchema:
                print(f"   参数结构: {tool.inputSchema}")
            print()
        
        return tools
    except Exception as e:
        print(f"获取工具详细信息失败: {e}")
        return None


async def execute_tool_example(manager: MCPClientManager):
    """执行工具示例"""
    print("=== 执行工具示例 ===")
    
    try:
        # 获取所有工具
        tools = manager.get_all_tools()
        
        if not tools:
            print("没有可用的工具")
            return
        
        # 选择第一个工具作为示例
        tool = tools[0]
        print(f"尝试执行工具: {tool.name}")
        
        # 这里需要根据具体的工具来构造参数
        # 由于不知道具体的工具参数，这里只是演示结构
        # 实际使用时需要根据工具的 inputSchema 来构造正确的参数
        
        print(f"工具 {tool.name} 的参数结构:")
        if hasattr(tool, 'inputSchema'):
            print(tool.inputSchema)
        
        # 注意：实际执行工具需要正确的参数
        # result = await manager.call_tool(tool.name, {"param1": "value1"})
        # print(f"执行结果: {result}")
        
    except Exception as e:
        print(f"执行工具失败: {e}")


async def run_mcp_examples():
    """运行 MCP 客户端示例"""
    print("开始 MCP 客户端示例...")
    
    # 1. 创建 MCP 客户端管理器
    manager = await create_mcp_client_manager()
    
    # 2. 列出所有可用的工具
    await list_available_tools(manager)
    
    # 3. 获取工具详细信息
    await get_tool_details(manager)
    
    # 4. 执行工具示例
    await execute_tool_example(manager)
    
    print("\n=== MCP 客户端示例完成 ===")


async def interactive_mcp_client():
    """交互式 MCP 客户端"""
    print("=== 交互式 MCP 客户端 ===")
    
    # 创建管理器
    manager = await create_mcp_client_manager()
    
    while True:
        print("\n选择操作:")
        print("1. 列出所有工具")
        print("2. 获取工具详细信息")
        print("3. 执行工具")
        print("4. 退出")
        
        choice = input("请输入选择 (1-4): ")
        
        if choice == "1":
            await list_available_tools(manager)
        elif choice == "2":
            await get_tool_details(manager)
        elif choice == "3":
            await execute_tool_example(manager)
        elif choice == "4":
            print("退出交互式客户端")
            break
        else:
            print("无效选择，请重新输入")


if __name__ == "__main__":
    # 运行不同的示例
    print("选择要运行的示例:")
    print("1. 基础 MCP 客户端示例")
    print("2. 交互式 MCP 客户端")
    
    choice = input("请输入选择 (1-2): ")
    
    if choice == "1":
        asyncio.run(run_mcp_examples())
    elif choice == "2":
        asyncio.run(interactive_mcp_client())
    else:
        print("无效选择，运行基础示例")
        asyncio.run(run_mcp_examples()) 